package com.mc.fastkit.ext

import android.os.Build
import androidx.annotation.RequiresApi
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale

val LocalDate.isToday: Boolean
    @RequiresApi(Build.VERSION_CODES.O)
    get() = this == LocalDate.now()

val LocalDateTime.isToday: Boolean
    @RequiresApi(Build.VERSION_CODES.O)
    get() = this.toLocalDate() == LocalDateTime.now().toLocalDate()

val Long.localDate: LocalDate
    @RequiresApi(Build.VERSION_CODES.O)
    get() = Instant.ofEpochMilli(this).atZone(ZoneId.systemDefault()).toLocalDate()

val Long.localTime: LocalTime
    @RequiresApi(Build.VERSION_CODES.O)
    get() = Instant.ofEpochMilli(this).atZone(ZoneId.systemDefault()).toLocalTime()

val Long.localDateTime: LocalDateTime
    @RequiresApi(Build.VERSION_CODES.O)
    get() = Instant.ofEpochMilli(this).atZone(ZoneId.systemDefault()).toLocalDateTime()

@RequiresApi(Build.VERSION_CODES.O)
fun LocalDate.format(pattern: String, locale: Locale = Locale.getDefault()): String {
    return format(DateTimeFormatter.ofPattern(pattern, locale))
}

@RequiresApi(Build.VERSION_CODES.O)
fun LocalTime.format(pattern: String, locale: Locale = Locale.getDefault()): String {
    return format(DateTimeFormatter.ofPattern(pattern, locale))
}

@RequiresApi(Build.VERSION_CODES.O)
fun LocalDateTime.format(pattern: String, locale: Locale = Locale.getDefault()): String {
    return format(DateTimeFormatter.ofPattern(pattern, locale))
}

@RequiresApi(Build.VERSION_CODES.O)
fun String.toLocalDate(pattern: String, locale: Locale = Locale.getDefault()): LocalDate {
    return LocalDate.parse(this, DateTimeFormatter.ofPattern(pattern, locale))
}

@RequiresApi(Build.VERSION_CODES.O)
fun String.toLocalTime(pattern: String, locale: Locale = Locale.getDefault()): LocalTime {
    return LocalTime.parse(this, DateTimeFormatter.ofPattern(pattern, locale))
}

@RequiresApi(Build.VERSION_CODES.O)
fun String.toLocalDateTime(pattern: String, locale: Locale = Locale.getDefault()): LocalDateTime {
    return LocalDateTime.parse(this, DateTimeFormatter.ofPattern(pattern, locale))
}